

	list p=16f84 

EST     equ     0x03        
PA      equ     0x05        
PB      equ     0x06        
cont1   equ     0x0c        
cont2   equ     0x0d        
cont3	equ		0x0e
cont4	equ		0x0f
cont5	equ		0x10
cont6	equ		0x11
cont7	equ		0x12
cont8	equ		0x13
cont9	equ		0x14

	org     00h           
   	goto    INICIO
    org     04h
		
	
INICIO 
	bsf     EST,5              
	movlw   b'11111000'     
	movwf   PA  
	movlw   b'00001111'     
	movwf  	PB          
  	bcf  	EST,5       
	clrf	PB
	clrf	PA					;_
	movlw	.255					; |
	movwf	cont6					; |
	movlw	.255					; | Entre estos tres k se setea el tiempo sin sonido para 
	movwf	cont7					; | que la potencia se ponga en modo sleep.  
	movlw	.255					; | Aprox:(255;255;255;4) = 2 horas.
	movwf	cont8					; |
	movlw	.4					;_|
	movwf	cont9	
	bcf		PA,2				;apaga el cooler
	call	delay_yelow_5
	bsf		PA,0				;Habilita el soft on
	call	delay_yelow_1000
	bsf		PA,1 				;Habilita los parlantes

MAIN	
	clrwdt
	call	signall	
	call	clippl
	call 	signalr
	call	clippr
	call	protect_short	
	call	protect_over
	bcf		PA,2				; si todo esta en orden pone el cooler Normal
	bsf		PA,1				; si todo esta en orden conecta los parlantes
	bsf		PA,0				; habilita el soft on (por si sale del modo sleep)	
	clrwdt
	call	func_sleep
	goto 	MAIN

protect_over
	btfsc	PA,3
	return						;_
	call	DELAY					; |=> espera un tiempo y vuelve a preguntar para evitar ruidos
	btfsc	PA,3					; |
	return						;_|
	bsf		PA,2				;pone el cooler al maximo
	bcf		PA,1				;desconecta los parlantes
	bsf		PA,0				;por las dudas (si es llamado desde sleep) Habilita el soft on
	call	delay_yelow_5		
	call	delay_yelow_5	
	call	delay_yelow_5
	call	delay_yelow_5
	bcf		PA,0				;por las dudas (si es llamado desde sleep) Desabilita el soft on
	btfsc	PA,3
	return
	goto	protect_over

protect_short
	btfss	PA,4
	return
	bcf		PA,1				;desconecta los parlantes
	bsf		PA,2				;pone el cooler al maximo
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	call	delay400
	call	delay_yelow_1000
	return

signalr
	btfss	PB,2
	bsf		PB,5
	btfsc	PB,2
	bcf		PB,5
	return	

signall
	btfss	PB,3
	bsf		PB,4
	btfsc	PB,3
	bcf		PB,4
	return

clippr

	btfss	PB,0
	bsf		PB,6
	btfsc	PB,0
	bcf		PB,6
	btfss	PB,0
	bcf		PB,5
	return

clippl
	btfss	PB,1
	bsf		PB,7
	btfsc	PB,1
	bcf		PB,7
	btfss	PB,1
	bcf		PB,4
	return

func_sleep
	btfss	PB,2
	goto	reset_sleep
	btfss	PB,3
	goto	reset_sleep
	clrf	PB					;apaga los leds que quedaron prendidos
	decfsz	cont6
	return
	decfsz	cont7
	return
	decfsz	cont8
	return
	decfsz	cont9
	return
	bcf		PA,0				;Desabilita el soft on
	bcf		PA,1 				;Desabilita los parlantes
h	btfss	PB,2
	goto	reset_sleep
	btfss	PB,3
	goto	reset_sleep
	clrwdt
	call	protect_over		;por las dudas testea igual el tema de la temperatura
	goto	h
reset_sleep
	movlw	0xff
	movwf	cont6
	movlw	0xff
	movwf	cont7
	movlw	0xff
	movwf	cont8
	movlw	0x04
	movwf	cont9
	return

DELAY  
	movlw	.10
	movwf	cont1
lazo2
	movlw	.10
	movwf	cont2
lazo1
	nop
	nop
	nop
	clrwdt
	nop
	nop
	nop
	decfsz	cont2,1
	goto	lazo1
	decfsz	cont1,1
	goto	lazo2
	return	

delay100ms
	movlw	.200
	movwf	cont3
lazo3
	call	DELAY
	decfsz	cont3,1
	goto	lazo3
	return

delay400
	call	delay100ms
	call	delay100ms
	clrwdt
	return

delay_yelow
	clrwdt
	movlw	b'00110000'
	movwf	PB
	call	DELAY
	movlw	b'11000000'
	movwf	PB
	call	DELAY
	return	

delay_yelow_1000
	clrwdt
	movlw	.100
	movwf	cont4
lazo4
	call	delay_yelow
	decfsz	cont4,1
	goto	lazo4
	clrf	PB	
	return	

delay_yelow_5
	clrwdt
	movlw	.5
	movwf	cont5
lazo5
	call	delay_yelow_1000
	decfsz	cont5,1
	goto	lazo5
	return	
	
	END 		
